--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
android/app/src/main/java/com/meshchatx/AndroidStorageManager.java 2fe900061e4d5da639a129894494e020b4b686d9 (2fe90006) Text, 9.81 KB
Tff7b72package T7ee787com.meshchatxTb4b4b4;
Tff7b72import T7ee787android.content.ContextTb4b4b4;
Tff7b72import T7ee787android.content.SharedPreferencesTb4b4b4;
Tff7b72import T7ee787java.io.FileTb4b4b4;
Tff7b72import T7ee787java.io.FileInputStreamTb4b4b4;
Tff7b72import T7ee787java.io.FileOutputStreamTb4b4b4;
Tff7b72import T7ee787java.io.IOExceptionTb4b4b4;
Tff7b72import T7ee787java.nio.channels.FileChannelTb4b4b4;
Tff7b72import T7ee787org.json.JSONObjectTb4b4b4;
T8b949e/**
* Resolves MeshChatX data roots on Android (app-internal vs app-specific external storage)
* and runs one-shot copy migrations before the embedded Python server starts.
*/
Tff7b72public Tff7b72final Tff7b72class T56d364AndroidStorageManager Tb4b4b4{
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3PREFS_NAME Tff7b72= Ta5d6ff"Ta5d6ffmeshchatxTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3PREF_STORAGE_MODE Tff7b72= Ta5d6ff"Ta5d6ffandroid_storage_modeTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3PREF_SETUP_COMPLETED Tff7b72= Ta5d6ff"Ta5d6ffandroid_storage_setup_completedTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3PREF_PENDING_COPY_EXTERNAL Tff7b72= Ta5d6ff"Ta5d6ffandroid_storage_pending_copy_externalTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3PREF_UPGRADE_PROMPT_VERSION Tff7b72= Ta5d6ff"Ta5d6ffandroid_storage_upgrade_prompt_versionTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3MODE_INTERNAL Tff7b72= Ta5d6ff"Ta5d6ffinternalTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3MODE_EXTERNAL Tff7b72= Ta5d6ff"Ta5d6ffexternalTa5d6ff"Tb4b4b4;
Tff7b72public Tff7b72static Tff7b72final Te6edf3String Te6edf3MESHCHAT_DIR Tff7b72= Ta5d6ff"Ta5d6ffmeshchatxTa5d6ff"Tb4b4b4;
Tff7b72private Td2a8ffAndroidStorageManagerTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3SharedPreferences Td2a8ffprefsTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3contextTb4b4b4.Te6edf3getSharedPreferencesTb4b4b4(Te6edf3PREFS_NAMETb4b4b4, Te6edf3ContextTb4b4b4.Te6edf3MODE_PRIVATETb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3File Td2a8ffinternalBaseDirTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3contextTb4b4b4.Te6edf3getFilesDirTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3File Td2a8ffexternalBaseDirTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Te6edf3File Te6edf3external Tff7b72= Te6edf3contextTb4b4b4.Te6edf3getExternalFilesDirTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3external Tff7b72!Tff7b72= Tff7b72null Tff7b72? Te6edf3external Tb4b4b4: Te6edf3contextTb4b4b4.Te6edf3getFilesDirTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3File Td2a8ffbaseDirForModeTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Te6edf3String Te6edf3modeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3MODE_EXTERNALTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3modeTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3externalBaseDirTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3internalBaseDirTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3File Td2a8ffmeshchatRootTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Te6edf3String Te6edf3modeTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72new Te6edf3FileTb4b4b4(Te6edf3baseDirForModeTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3modeTb4b4b4)Tb4b4b4, Te6edf3MESHCHAT_DIRTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3String Td2a8ffgetConfiguredModeTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3getStringTb4b4b4(Te6edf3PREF_STORAGE_MODETb4b4b4, Tff7b72nullTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffsetConfiguredModeTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Te6edf3String Te6edf3modeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3MODE_INTERNALTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3modeTb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3MODE_EXTERNALTb4b4b4.Te6edf3equalsTb4b4b4(Te6edf3modeTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IllegalArgumentExceptionTb4b4b4(Ta5d6ff"Ta5d6ffInvalid storage mode: Ta5d6ff" Tff7b72+ Te6edf3modeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3editTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3putStringTb4b4b4(Te6edf3PREF_STORAGE_MODETb4b4b4, Te6edf3modeTb4b4b4)Tb4b4b4.Te6edf3applyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffmarkSetupCompletedTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3editTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3putBooleanTb4b4b4(Te6edf3PREF_SETUP_COMPLETEDTb4b4b4, Tff7b72trueTb4b4b4)Tb4b4b4.Te6edf3applyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffisSetupCompletedTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3getBooleanTb4b4b4(Te6edf3PREF_SETUP_COMPLETEDTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffscheduleCopyToExternalTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)
Tb4b4b4.Te6edf3editTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3putBooleanTb4b4b4(Te6edf3PREF_PENDING_COPY_EXTERNALTb4b4b4, Tff7b72trueTb4b4b4)
Tb4b4b4.Te6edf3applyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffisPendingCopyToExternalTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3getBooleanTb4b4b4(Te6edf3PREF_PENDING_COPY_EXTERNALTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffclearPendingCopyToExternalTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3editTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3removeTb4b4b4(Te6edf3PREF_PENDING_COPY_EXTERNALTb4b4b4)Tb4b4b4.Te6edf3applyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffmarkUpgradePromptSeenTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Tffa657int Te6edf3versionCodeTb4b4b4) Tb4b4b4{
Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3editTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3putIntTb4b4b4(Te6edf3PREF_UPGRADE_PROMPT_VERSIONTb4b4b4, Te6edf3versionCodeTb4b4b4)Tb4b4b4.Te6edf3applyTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657int Td2a8ffgetUpgradePromptSeenVersionTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3prefsTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3getIntTb4b4b4(Te6edf3PREF_UPGRADE_PROMPT_VERSIONTb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffhasMeshchatDataTb4b4b4(Te6edf3File Te6edf3rootTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3root Tff7b72=Tff7b72= Tff7b72null Tff7b72|Tff7b72| Tff7b72!Te6edf3rootTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3File Te6edf3storage Tff7b72= Tff7b72new Te6edf3FileTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3directoryHasEntriesTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Te6edf3File Te6edf3reticulum Tff7b72= Tff7b72new Te6edf3FileTb4b4b4(Te6edf3rootTb4b4b4, Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3directoryHasEntriesTb4b4b4(Te6edf3reticulumTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72private Tff7b72static Tffa657boolean Td2a8ffdirectoryHasEntriesTb4b4b4(Te6edf3File Te6edf3dirTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3dirTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Te6edf3StringTff7b72[Tff7b72] Te6edf3names Tff7b72= Te6edf3dirTb4b4b4.Te6edf3listTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3names Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3namesTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffhasInternalMeshchatDataTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3hasMeshchatDataTb4b4b4(Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_INTERNALTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffhasExternalMeshchatDataTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3hasMeshchatDataTb4b4b4(Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_EXTERNALTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Active mode used to start the embedded server on this process launch.
*/
Tff7b72public Tff7b72static Te6edf3String Td2a8ffresolveActiveModeTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Te6edf3String Te6edf3configured Tff7b72= Te6edf3getConfiguredModeTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configured Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3configuredTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hasInternalMeshchatDataTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3MODE_INTERNALTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3MODE_EXTERNALTb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3File Td2a8ffresolveActiveBaseDirTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3baseDirForModeTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3resolveActiveModeTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
T8b949e/**
* Copy internal meshchatx tree to external when requested, then pin mode to external.
*/
Tff7b72public Tff7b72static Tffa657void Td2a8ffrunPendingMigrationTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3isPendingCopyToExternalTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Te6edf3File Te6edf3src Tff7b72= Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_INTERNALTb4b4b4)Tb4b4b4;
Te6edf3File Te6edf3dst Tff7b72= Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_EXTERNALTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasMeshchatDataTb4b4b4(Te6edf3srcTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3copyDirectoryTb4b4b4(Te6edf3srcTb4b4b4, Te6edf3dstTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3setConfiguredModeTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_EXTERNALTb4b4b4)Tb4b4b4;
Te6edf3markSetupCompletedTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Te6edf3clearPendingCopyToExternalTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Tffa657int Te6edf3versionCode Tff7b72= Te6edf3readAppVersionCodeTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3versionCode Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3markUpgradePromptSeenTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3versionCodeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72static Tffa657int Td2a8ffreadAppVersionCodeTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72return Te6edf3contextTb4b4b4.Te6edf3getPackageManagerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3getPackageInfoTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3getPackageNameTb4b4b4(Tb4b4b4)Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3versionCodeTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3Exception Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffexternalStorageAvailableTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Te6edf3File Te6edf3external Tff7b72= Te6edf3contextTb4b4b4.Te6edf3getExternalFilesDirTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3external Tff7b72!Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffneedsSetupChoiceTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3getConfiguredModeTb4b4b4(Te6edf3contextTb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72!Te6edf3isSetupCompletedTb4b4b4(Te6edf3contextTb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3hasInternalMeshchatDataTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657boolean Td2a8ffneedsUpgradePromptTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Tffa657int Te6edf3appVersionCodeTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3getConfiguredModeTb4b4b4(Te6edf3contextTb4b4b4) Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3hasInternalMeshchatDataTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3isPendingCopyToExternalTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3getUpgradePromptSeenVersionTb4b4b4(Te6edf3contextTb4b4b4) Tff7b72< Te6edf3appVersionCodeTb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffkeepInternalAndDismissUpgradeTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Tffa657int Te6edf3appVersionCodeTb4b4b4) Tb4b4b4{
Te6edf3setConfiguredModeTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_INTERNALTb4b4b4)Tb4b4b4;
Te6edf3markSetupCompletedTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Te6edf3markUpgradePromptSeenTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3appVersionCodeTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Te6edf3String Td2a8ffstatusJsonTb4b4b4(Te6edf3Context Te6edf3contextTb4b4b4, Tffa657int Te6edf3appVersionCodeTb4b4b4) Tff7b72throws Te6edf3Exception Tb4b4b4{
Te6edf3String Te6edf3configured Tff7b72= Te6edf3getConfiguredModeTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Te6edf3String Te6edf3active Tff7b72= Te6edf3resolveActiveModeTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4;
Te6edf3JSONObject Te6edf3json Tff7b72= Tff7b72new Te6edf3JSONObjectTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffplatformTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffandroidTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffconfigured_modeTa5d6ff"Tb4b4b4, Te6edf3configured Tff7b72=Tff7b72= Tff7b72null Tff7b72? Te6edf3JSONObjectTb4b4b4.Te6edf3NULL Tb4b4b4: Te6edf3configuredTb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffactive_modeTa5d6ff"Tb4b4b4, Te6edf3activeTb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffinternal_pathTa5d6ff"Tb4b4b4, Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_INTERNALTb4b4b4)Tb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffexternal_pathTa5d6ff"Tb4b4b4, Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3MODE_EXTERNALTb4b4b4)Tb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffactive_pathTa5d6ff"Tb4b4b4, Te6edf3meshchatRootTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3activeTb4b4b4)Tb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffhas_internal_dataTa5d6ff"Tb4b4b4, Te6edf3hasInternalMeshchatDataTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffhas_external_dataTa5d6ff"Tb4b4b4, Te6edf3hasExternalMeshchatDataTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffneeds_setup_choiceTa5d6ff"Tb4b4b4, Te6edf3needsSetupChoiceTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffneeds_upgrade_promptTa5d6ff"Tb4b4b4, Te6edf3needsUpgradePromptTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3appVersionCodeTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffpending_copyTa5d6ff"Tb4b4b4, Te6edf3isPendingCopyToExternalTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffexternal_availableTa5d6ff"Tb4b4b4, Te6edf3externalStorageAvailableTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3jsonTb4b4b4.Te6edf3putTb4b4b4(Ta5d6ff"Ta5d6ffsetup_completedTa5d6ff"Tb4b4b4, Te6edf3isSetupCompletedTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3jsonTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffcopyDirectoryTb4b4b4(Te6edf3File Te6edf3sourceTb4b4b4, Te6edf3File Te6edf3targetTb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3sourceTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3sourceTb4b4b4.Te6edf3isFileTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3copyFileTb4b4b4(Te6edf3sourceTb4b4b4, Te6edf3targetTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3sourceTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3targetTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3targetTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffmkdirs failed: Ta5d6ff" Tff7b72+ Te6edf3targetTb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3FileTff7b72[Tff7b72] Te6edf3children Tff7b72= Te6edf3sourceTb4b4b4.Te6edf3listFilesTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3children Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3File Te6edf3child Tb4b4b4: Te6edf3childrenTb4b4b4) Tb4b4b4{
Te6edf3copyDirectoryTb4b4b4(Te6edf3childTb4b4b4, Tff7b72new Te6edf3FileTb4b4b4(Te6edf3targetTb4b4b4, Te6edf3childTb4b4b4.Te6edf3getNameTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72public Tff7b72static Tffa657void Td2a8ffcopyFileTb4b4b4(Te6edf3File Te6edf3sourceTb4b4b4, Te6edf3File Te6edf3targetTb4b4b4) Tff7b72throws Te6edf3IOException Tb4b4b4{
Te6edf3File Te6edf3parent Tff7b72= Te6edf3targetTb4b4b4.Te6edf3getParentFileTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3parent Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3parentTb4b4b4.Te6edf3existsTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3parentTb4b4b4.Te6edf3mkdirsTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Te6edf3IOExceptionTb4b4b4(Ta5d6ff"Ta5d6ffmkdirs failed: Ta5d6ff" Tff7b72+ Te6edf3parentTb4b4b4.Te6edf3getAbsolutePathTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72try Tb4b4b4(Te6edf3FileInputStream Te6edf3in Tff7b72= Tff7b72new Te6edf3FileInputStreamTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4;
Te6edf3FileOutputStream Te6edf3out Tff7b72= Tff7b72new Te6edf3FileOutputStreamTb4b4b4(Te6edf3targetTb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4;
Te6edf3FileChannel Te6edf3inChannel Tff7b72= Te6edf3inTb4b4b4.Te6edf3getChannelTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3FileChannel Te6edf3outChannel Tff7b72= Te6edf3outTb4b4b4.Te6edf3getChannelTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657long Te6edf3size Tff7b72= Te6edf3inChannelTb4b4b4.Te6edf3sizeTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657long Te6edf3transferred Tff7b72= T79c0ff0Te6edf3LTb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3transferred Tff7b72< Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3transferred Tff7b72+Tff7b72= Te6edf3inChannelTb4b4b4.Te6edf3transferToTb4b4b4(Te6edf3transferredTb4b4b4, Te6edf3size Tff7b72- Te6edf3transferredTb4b4b4, Te6edf3outChannelTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3outChannelTb4b4b4.Te6edf3forceTb4b4b4(Tff7b72trueTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────